import sys

#1.简单的几何图形类
# 涉及知识点
# 类的定义和初始化（__init__ 方法）
# 实例属性和方法
# 运算符重载（__lt__ 方法用于比较大小）

# 方法是否属于属性
# 在 Python 里，方法本质上也属于属性。类的属性可以分为数据属性（变量）和方法属性（函数）。

# 数据属性
# 数据属性是类或实例中存储数据的变量，像你代码里的 width_、height_ 是类属性，length、width 是实例属性。

# 方法属性
# 方法属性是定义在类中的函数，用于实现特定功能。Python 里的方法可分为实例方法、类方法和静态方法。

# 实例方法：第一个参数通常是 self，代表实例本身。
# 类方法：使用 @classmethod 装饰器，第一个参数通常是 cls，代表类本身。
# 静态方法：使用 @staticmethod 装饰器，没有特殊的第一个参数。

# 构造函数为何能定义不属于类属性的变量
# 在 Python 中，构造函数 __init__ 用于初始化实例对象的状态。通过 __init__ 定义的变量是实例属性，而非类属性，这和 C++ 有所不同。

# 类属性和实例属性的区别
# 类属性：由类的所有实例共享，存储在类对象中。
# 实例属性：每个实例独有的属性，存储在实例对象中。
# 为何要定义实例属性
# 实例属性可让每个实例拥有自己独特的状态。比如在 Rectangle 类里，每个矩形实例的长和宽可能不同，通过 __init__ 方法为每个实例设置不同的 length 和 width，就能表示不同的矩形。
class Rectangle:
    #类似于静态变量，类的示例共享他们
    width_ = 3
    height_ = 4
    def __init__(self, length, width):
        self.length = length
        self.width = width
    def area(self):
        return self.length * self.width
    def perimeter(self):
        return 2 * (self.length + self.width)
     # 类方法
    @classmethod
    def set_class_attr(cls, new_width, new_height):
        cls.width_ = new_width
        cls.height_ = new_height

    # 静态方法
    @staticmethod
    def is_square(length, width):
        return length == width
#     在 Python 里，__lt__ 是一个特殊方法（也被称作魔术方法），主要用于实现对象之间的小于（<）比较操作。下面详细介绍 __lt__ 相关知识点。

# 1. 基本概念
# __lt__ 是 less than 的缩写，当使用小于运算符 < 对自定义类的实例进行比较时，Python 会尝试调用该实例的 __lt__ 方法。此方法接收两个参数，
# self 代表调用该方法的实例，other 代表与之比较的另一个实例，并且需要返回一个布尔值。
    def __lt__(self, other):
        return self.area() > other.area()
    
rect1 = Rectangle(2,4);
rect2 = Rectangle(1,2)

flag = rect1 > rect2
print(flag)

#测试他们是否共享类属性
print(rect2.height_,rect2.width_)
# 通过类名修改类属性
Rectangle.height_ = 5
Rectangle.width_ = 4
print(rect2.height_,rect2.width_)

# 验证方法也是属性
print(hasattr(Rectangle, 'area'))  # 输出 True
print(hasattr(Rectangle, 'set_class_attr'))  # 输出 True
print(hasattr(Rectangle, 'is_square'))  # 输出 True

# 在 Python 里，当你通过实例访问某个属性时，Python 会按照特定的顺序来查找这个属性，“向上查找类属性”描述的就是这个查找过程。下面详细解释查找机制。

# 属性查找顺序
# Python 实例在访问属性时，会遵循如下顺序进行查找：

# 实例属性：首先检查实例本身是否有该属性。如果有，就直接返回实例属性的值。
# 类属性：若实例本身没有该属性，Python 会“向上”查找实例所属类的属性。这里的“向上”指的是从实例对象的层面上升到类对象的层面去查找。如果类有该属性，就返回类属性的值。
# 父类属性（若涉及继承）：如果类里也没有该属性，并且类存在父类，Python 会继续沿着继承链向上查找父类的属性，直到找到该属性或者到达继承链的顶端（通常是 object 类）。
# 抛出 AttributeError 异常：若最终都没找到该属性，Python 会抛出 AttributeError 异常。

# 创建实例
rect3 = Rectangle(1, 2)

# 访问实例属性 length，实例本身有该属性，直接返回实例属性的值
print(rect3.length)  # 输出 1

# 访问 width_ 属性，实例本身没有该属性，向上查找类属性
print(rect3.width_)  # 输出 3

# 为 rect3 实例添加同名实例属性
rect3.width_ = 5

# 再次访问 width_ 属性，此时实例本身有该属性，直接返回实例属性的值
print(rect3.width_)  # 输出 5

# 通过类名访问类属性，类属性的值并未改变
print(Rectangle.width_)  # 输出 3



def my_lower(input_str):
    result = ""
    for char in input_str:
        if 'A' <= char <= 'Z':
            # 将大写字母转换为小写字母，通过 ASCII 码值加 32 实现
            result += chr(ord(char) + 32)
        else:
            result += char
    return result

print(my_lower('H'))